library(dplyr)
library(survival)
library(mice)
library(MatchThem)
library(survey)
library(here)
library(gtsummary)
library(parallelly)
library(ranger)
library(furrr)
library(cobalt)
source(here("functions", "source_encore.io_functions.R"))
# track time
runtime <- tictoc::tic()3 Application in Cox PH models
Comparison of coxph versus svycoxph after multiple imputation and propensity score matching
In Chapter 3 we illustrate a reproducible example on how to use coxph (survival package (Therneau 2024)) and svycoxph (survey package (Lumley 2024)) in combination with multiple imputation by chained equations (mice package (Buuren and Groothuis-Oudshoorn 2011)) and propensity score matching using the MatchThem package (Pishgar et al. 2021).
First, we load the required R libraries/packages and some custom functions that are part of the encore.io R package that is being developed to streamline the analysis of all ENCORE trial emulations (non-public package).
3.1 Data generation
We use the simulate_flaura() function to simulate a realistic oncology comparative effectiveness analytic cohort dataset with similar distributions to FLAURA, a randomized controlled trial that evaluated the efficacy and safety of osimertinib to standard-of-care (SoC) tyrosine kinase inhibitors (TKIs) in advanced NSCLC patients with a sensitizing EGFR mutation.
The following cohort resembles distributions observed in the EHR-derived EDB1dataset used in ENCORE. Note: the values of some continuous covariates (labs) are displayed after log/log-log transformation.
# load example dataset with missing observations
data_miss <- simulate_flaura(
n_total = 3500,
treat_prevalence = .51,
seed = 42,
include_id = FALSE,
imposeNA = TRUE
)
# store covariates
covariates <- data_miss |>
select(starts_with("dem_"), starts_with("c_")) |>
colnames()
# crate Table 1
data_miss |>
tbl_summary(
by = "treat",
include = covariates
) |>
add_overall() |>
modify_header(
label ~ "**Patient characteristic**",
stat_0 ~ "**Total** <br> N = {N}",
stat_1 ~ "**Comparator** <br> N = {n} <br> ({style_percent(p, digits=1)}%)",
stat_2 ~ "**Exposure** <br> N = {n} <br> ({style_percent(p, digits=1)}%)"
) |>
modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**") |>
modify_caption("**Table 1. Patient Characteristics**")Patient characteristic |
Total |
Treatment received |
|
|---|---|---|---|
Comparator |
Exposure |
||
| dem_age_index_cont | 69 (64, 75) | 70 (63, 76) | 69 (64, 74) |
| dem_sex_cont | 1,183 (34%) | 614 (36%) | 569 (32%) |
| dem_race | 1,417 (61%) | 664 (59%) | 753 (63%) |
| Unknown | 1,162 | 578 | 584 |
| dem_region | |||
| Midwest | 260 (11%) | 123 (11%) | 137 (11%) |
| Northeast | 772 (33%) | 382 (34%) | 390 (32%) |
| South | 865 (37%) | 409 (36%) | 456 (38%) |
| West | 441 (19%) | 220 (19%) | 221 (18%) |
| Unknown | 1,162 | 578 | 584 |
| dem_ses | |||
| 1 | 319 (14%) | 102 (9.0%) | 217 (18%) |
| 2 | 309 (13%) | 152 (13%) | 157 (13%) |
| 3 | 512 (22%) | 302 (27%) | 210 (17%) |
| 4 | 562 (24%) | 271 (24%) | 291 (24%) |
| 5 | 636 (27%) | 307 (27%) | 329 (27%) |
| Unknown | 1,162 | 578 | 584 |
| c_smoking_history | 1,099 (47%) | 579 (51%) | 520 (43%) |
| Unknown | 1,162 | 578 | 584 |
| c_number_met_sites | |||
| 1 | 1,736 (74%) | 837 (74%) | 899 (75%) |
| 2 | 504 (22%) | 249 (22%) | 255 (21%) |
| 3 | 83 (3.6%) | 41 (3.6%) | 42 (3.5%) |
| 4 | 15 (0.6%) | 7 (0.6%) | 8 (0.7%) |
| Unknown | 1,162 | 578 | 584 |
| c_ecog_cont | 1,351 (58%) | 714 (63%) | 637 (53%) |
| Unknown | 1,162 | 578 | 584 |
| c_stage_initial_dx_cont | |||
| 1 | 101 (4.3%) | 101 (8.9%) | 0 (0%) |
| 2 | 29 (1.2%) | 17 (1.5%) | 12 (1.0%) |
| 3 | 53 (2.3%) | 15 (1.3%) | 38 (3.2%) |
| 4 | 2,155 (92%) | 1,001 (88%) | 1,154 (96%) |
| Unknown | 1,162 | 578 | 584 |
| c_hemoglobin_g_dl_cont | 12.92 (12.09, 13.74) | 12.97 (12.16, 13.72) | 12.89 (11.98, 13.75) |
| Unknown | 1,162 | 578 | 584 |
| c_urea_nitrogen_mg_dl_cont | 2.77 (2.53, 3.02) | 2.76 (2.42, 3.08) | 2.77 (2.58, 2.97) |
| Unknown | 1,162 | 578 | 584 |
| c_platelets_10_9_l_cont | 261 (224, 297) | 255 (218, 290) | 266 (230, 302) |
| Unknown | 1,162 | 578 | 584 |
| c_calcium_mg_dl_cont | 2.23 (2.21, 2.26) | 2.23 (2.21, 2.25) | 2.24 (2.21, 2.27) |
| Unknown | 1,162 | 578 | 584 |
| c_glucose_mg_dl_cont | 4.65 (4.57, 4.73) | 4.64 (4.55, 4.72) | 4.65 (4.58, 4.73) |
| Unknown | 1,162 | 578 | 584 |
| c_lymphocyte_leukocyte_ratio_cont | 2.93 (2.81, 3.06) | 2.94 (2.81, 3.08) | 2.93 (2.82, 3.04) |
| Unknown | 1,162 | 578 | 584 |
| c_alp_u_l_cont | 4.49 (4.39, 4.60) | 4.47 (4.33, 4.61) | 4.51 (4.42, 4.59) |
| Unknown | 1,162 | 578 | 584 |
| c_protein_g_l_cont | 68.4 (65.6, 71.4) | 67.8 (65.1, 70.6) | 69.0 (66.0, 72.1) |
| Unknown | 1,162 | 578 | 584 |
| c_alt_u_l_cont | 2.90 (2.69, 3.12) | 2.93 (2.72, 3.14) | 2.86 (2.64, 3.10) |
| Unknown | 1,162 | 578 | 584 |
| c_albumin_g_l_cont | 39.51 (37.33, 41.58) | 39.01 (36.94, 41.01) | 39.98 (37.76, 42.07) |
| Unknown | 1,162 | 578 | 584 |
| c_bilirubin_mg_dl_cont | -0.79 (-1.58, 0.01) | -0.71 (-1.45, 0.07) | -0.85 (-1.74, -0.03) |
| Unknown | 1,162 | 578 | 584 |
| c_chloride_mmol_l_cont | 102.07 (100.11, 104.14) | 102.08 (100.08, 104.20) | 102.05 (100.20, 104.12) |
| Unknown | 1,162 | 578 | 584 |
| c_monocytes_10_9_l_cont | -0.51 (-0.73, -0.31) | -0.53 (-0.78, -0.24) | -0.51 (-0.68, -0.35) |
| Unknown | 1,162 | 578 | 584 |
| c_eosinophils_leukocytes_ratio_cont | 0.71 (0.40, 1.02) | 0.72 (0.50, 0.97) | 0.69 (0.28, 1.07) |
| Unknown | 1,162 | 578 | 584 |
| c_ldh_u_l_cont | 1.68 (1.65, 1.72) | 1.68 (1.65, 1.71) | 1.69 (1.65, 1.72) |
| Unknown | 1,162 | 578 | 584 |
| c_hr_cont | 4.42 (4.40, 4.44) | 4.41 (4.39, 4.43) | 4.43 (4.40, 4.46) |
| Unknown | 1,162 | 578 | 584 |
| c_sbp_cont | 4.85 (4.78, 4.92) | 4.85 (4.77, 4.92) | 4.85 (4.79, 4.92) |
| Unknown | 1,162 | 578 | 584 |
| c_oxygen_cont | 97.001 (96.991, 97.009) | 97.000 (96.986, 97.014) | 97.001 (96.993, 97.007) |
| Unknown | 1,162 | 578 | 584 |
| c_neutrophil_lymphocyte_ratio_cont | 1.31 (1.07, 1.54) | 1.33 (1.11, 1.56) | 1.28 (1.02, 1.52) |
| Unknown | 1,162 | 578 | 584 |
| c_bmi_cont | 3.23 (3.14, 3.31) | 3.23 (3.14, 3.31) | 3.23 (3.14, 3.31) |
| Unknown | 1,162 | 578 | 584 |
| c_ast_alt_ratio_cont | 0.10 (-0.09, 0.31) | 0.09 (-0.10, 0.30) | 0.12 (-0.07, 0.32) |
| Unknown | 1,162 | 578 | 584 |
| c_time_dx_to_index | 52 (35, 75) | 73 (43, 103) | 43 (32, 55) |
| Unknown | 1,162 | 578 | 584 |
| c_de_novo_mets_dx | 1,719 (74%) | 774 (68%) | 945 (78%) |
| Unknown | 1,162 | 578 | 584 |
| c_height_cont | 1.65 (1.59, 1.70) | 1.64 (1.59, 1.69) | 1.65 (1.59, 1.70) |
| Unknown | 1,162 | 578 | 584 |
| c_weight_cont | 68 (60, 76) | 68 (60, 76) | 69 (61, 76) |
| Unknown | 1,162 | 578 | 584 |
| c_dbp_cont | 75 (71, 80) | 75 (70, 79) | 76 (72, 80) |
| Unknown | 1,162 | 578 | 584 |
| c_year_index | |||
| <2018 | 1,790 (51%) | 87 (5.1%) | 1,703 (95%) |
| 2018+ | 1,710 (49%) | 1,625 (95%) | 85 (4.8%) |
| 1
Median (Q1, Q3); n (%) |
|||
3.2 Step 1 - Multiple imputation
The first step after deriving the analytic cohort includes the creation of multiple imputed datasets using mice R package(Buuren and Groothuis-Oudshoorn 2011).
The
micealgorithm is one particular instance of a fully conditionally specified model. The algorithm starts with a random draw from the observed data, and imputes the incomplete data in a variable-by-variable fashion. One iteration consists of one cycle through all \(Y_j\).
The number of iterations \(M\) (= number of imputed datasets) in this example is 10, but in ENCORE we follow Stef van Buuren’s advice:
[…] if calculation is not prohibitive, we may set \(M\) to the average percentage of missing data.
Following the results of various simulation studies (Shah et al. 2014; Weberpals et al. 2024), we use a non-parametric (random forest-based) imputation approach as the actual imputation algorithm.
Parametric imputation models have to be correctly specified, i.e. also have to explicitly model nonlinear and non-additive covariate relationships
Many imputation algorithms are not prepared for mixed type of data
Popular: random forest-based algorithms
for each variable random forest is fit on the observed part and then predicts the missing part
missForest(Stekhoven and Bühlmann 2012) provides OOB error but only provides single imputations
Alternatives: rf, cart in
micepackage (Buuren and Groothuis-Oudshoorn 2011)
Note: In this example we utilize the futuremice() instead of the legacy mice() function to run the mice imputation across 3 cores in parallel.
# impute data
data_imp <- futuremice(
parallelseed = 42,
n.core = parallel::detectCores()-1,
data = data_miss,
method = "rf",
m = 10,
print = FALSE
)The imputation step creates an object of class…
class(data_imp)[1] "mids"
…which stands for multiple imputed datasets. It contains important information on the imputation procedure and the actual imputed datasets.
3.3 Step 2 - Propensity score matching and weighting
Apply propensity score matching and weighting with replacement within in each imputed dataset. As pointed in Section 2.3.1, the MIte approach performed best in terms of bias, standardized differences/balancing, coverage rate and variance estimation. In MatchThem this approach is referred to a within approach (performing matching within each dataset), while the inferior MIps approach (estimating propensity scores within each dataset, averaging them across datasets, and performing matching using the averaged propensity scores in each dataset) is referred to as across approach. Since MIte/within has been shown to have superior performance in most cases, we only illustrate this approach here.
Let’s assume we fit the following propensity score model within each imputed dataset.
# apply propensity score matching on mids object
ps_form <- as.formula(paste("treat ~", paste(covariates, collapse = " + ")))
ps_formtreat ~ dem_age_index_cont + dem_sex_cont + dem_race + dem_region +
dem_ses + c_smoking_history + c_number_met_sites + c_ecog_cont +
c_stage_initial_dx_cont + c_hemoglobin_g_dl_cont + c_urea_nitrogen_mg_dl_cont +
c_platelets_10_9_l_cont + c_calcium_mg_dl_cont + c_glucose_mg_dl_cont +
c_lymphocyte_leukocyte_ratio_cont + c_alp_u_l_cont + c_protein_g_l_cont +
c_alt_u_l_cont + c_albumin_g_l_cont + c_bilirubin_mg_dl_cont +
c_chloride_mmol_l_cont + c_monocytes_10_9_l_cont + c_eosinophils_leukocytes_ratio_cont +
c_ldh_u_l_cont + c_hr_cont + c_sbp_cont + c_oxygen_cont +
c_neutrophil_lymphocyte_ratio_cont + c_bmi_cont + c_ast_alt_ratio_cont +
c_time_dx_to_index + c_de_novo_mets_dx + c_height_cont +
c_weight_cont + c_dbp_cont + c_year_index
The matching step happens using the matchthem() function, which is a wrapper around the matchit() function. This function not only provides the functionality to match on the propensity score, but also to perform (coarsened) exact matching, cardinality matching, genetic matching and more. In this example, we use a simple 1:1 nearest neighbor matching on the propensity score (estimated through logistic regression) without replacement with a caliper of 1% of the standard deviation of the propensity score.
# matching
data_mimids <- matchthem(
formula = ps_form,
datasets = data_imp,
approach = 'within',
method = 'nearest',
distance = "glm",
link = "logit",
caliper = 0.01,
ratio = 1,
replace = F
)
# print summary for matched dataset #1
data_mimidsA matchit object
- method: 1:1 nearest neighbor matching without replacement
- distance: Propensity score [caliper]
- estimated with logistic regression
- caliper: <distance> (0.005)
- number of obs.: 3500 (original), 326 (matched)
- target estimand: ATT
- covariates: dem_age_index_cont, dem_sex_cont, dem_race, dem_region, dem_ses, c_smoking_history, c_number_met_sites, c_ecog_cont, c_stage_initial_dx_cont, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_time_dx_to_index, c_de_novo_mets_dx, c_height_cont, c_weight_cont, c_dbp_cont, c_year_index
The resulting “mimids” object contains the original imputed data and the output of the calls to matchit() applied to each imputed dataset.
The weighting step is performed very similarly using the weightthem() function. In this example weapply SMR weighting to arrive at the same ATT estimand as matching which is indicated through the estimand = "ATT" argument. In case we wanted to weight patients based on overlap weights, estimand = "AT0" would need to be specified (which is one of the sensitivity analyses in the FLAURA protocol).
To mitigate the risks of extreme weights, the subsequent trim() function truncates large weights by setting all weights higher than that at a given quantile (in this example the 95% quantile) to the weight at the quantile. Since we specify lower = TRUE, this is done symmetrically also with the 5% quantile.
# SMR weighting
data_wimids <- weightthem(
formula = ps_form,
datasets = data_imp,
approach = 'within',
method = "glm",
estimand = "ATT"
)
# trim extreme weights
data_wimids <- trim(
x = data_wimids,
at = .95,
lower = TRUE
)
data_wimidsA weightit object
- method: "glm" (propensity score weighting with GLM)
- number of obs.: 3500
- sampling weights: none
- treatment: 2-category
- estimand: ATT (focal: 1)
- covariates: dem_age_index_cont, dem_sex_cont, dem_race, dem_region, dem_ses, c_smoking_history, c_number_met_sites, c_ecog_cont, c_stage_initial_dx_cont, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_time_dx_to_index, c_de_novo_mets_dx, c_height_cont, c_weight_cont, c_dbp_cont, c_year_index
- weights trimmed at 5% and 95%
The resulting “wimids” object contains the original imputed data and the output of the calls to weightit() applied to each imputed dataset.
3.4 Step 3 - Balance assessment
The inspection of balance assessment in multiple imputed and matched/weighted data can be done in a similar way as with a single complete dataset. For illustration we just look at the matched datasets, but the exact same principles also apply to the weighted datasets.
# create balance table
balance_table <- bal.tab(
x = data_mimids,
stats = "m",
abs = TRUE
)
balance_tableBalance summary across all imputations
Type Mean.Diff.Adj Max.Diff.Adj
distance Distance 0.0097 0.0110
dem_age_index_cont Contin. 0.0594 0.1462
dem_sex_cont Binary 0.0351 0.0784
dem_race Binary 0.0287 0.0513
dem_region_Midwest Binary 0.0124 0.0244
dem_region_Northeast Binary 0.0265 0.0549
dem_region_South Binary 0.0184 0.0476
dem_region_West Binary 0.0217 0.0476
dem_ses Contin. 0.0566 0.1353
c_smoking_history Binary 0.0504 0.0976
c_number_met_sites Contin. 0.0683 0.1506
c_ecog_cont Binary 0.0233 0.0671
c_stage_initial_dx_cont Contin. 0.1082 0.2841
c_hemoglobin_g_dl_cont Contin. 0.0790 0.1193
c_urea_nitrogen_mg_dl_cont Contin. 0.0784 0.1850
c_platelets_10_9_l_cont Contin. 0.0406 0.1194
c_calcium_mg_dl_cont Contin. 0.0594 0.1412
c_glucose_mg_dl_cont Contin. 0.0508 0.1669
c_lymphocyte_leukocyte_ratio_cont Contin. 0.0678 0.1122
c_alp_u_l_cont Contin. 0.0482 0.1517
c_protein_g_l_cont Contin. 0.0471 0.1657
c_alt_u_l_cont Contin. 0.0487 0.1294
c_albumin_g_l_cont Contin. 0.0729 0.1827
c_bilirubin_mg_dl_cont Contin. 0.0751 0.1524
c_chloride_mmol_l_cont Contin. 0.0618 0.1275
c_monocytes_10_9_l_cont Contin. 0.1119 0.2827
c_eosinophils_leukocytes_ratio_cont Contin. 0.0363 0.0945
c_ldh_u_l_cont Contin. 0.0712 0.1967
c_hr_cont Contin. 0.0874 0.2097
c_sbp_cont Contin. 0.0789 0.1484
c_oxygen_cont Contin. 0.0402 0.1134
c_neutrophil_lymphocyte_ratio_cont Contin. 0.0483 0.1269
c_bmi_cont Contin. 0.1106 0.1908
c_ast_alt_ratio_cont Contin. 0.0614 0.1860
c_time_dx_to_index Contin. 0.0668 0.1631
c_de_novo_mets_dx Binary 0.0210 0.0427
c_height_cont Contin. 0.0600 0.1942
c_weight_cont Contin. 0.0634 0.1434
c_dbp_cont Contin. 0.0695 0.1386
c_year_index_2018+ Binary 0.0025 0.0065
Average sample sizes across imputations
0 1
All 1712 1788
Matched 161 161
Unmatched 1551 1627
love.plot(
x = data_mimids,
abs = TRUE,
thresholds = 0.1,
drop.distance = TRUE,
var.order = "unadjusted",
colors = c("orange", "blue"),
stars = "std",
shapes = 17,
size = 4,
grid = TRUE,
position = "top"
)bal.plot(
x = data_mimids,
var.name = "distance",
which = "both",
which.imp = .none,
colors = c("orange", "blue")
)3.5 Step 4 - Estimation of marginal treatment effects
Next, we compare the marginal treatment effect estimates coming from a Cox proportional hazards model after propensity score matching and weighting as implemented in the coxph() and in the svycoxph() functions.
From the MatchThem documentation:
with()applies the supplied model inexprto the (matched or weighted) multiply imputed datasets, automatically incorporating the (matching) weights when possible. The argument toexprshould be of the formglm(y ~ z, family = quasibinomial), for example, excluding the data or weights argument, which are automatically supplied.Functions from the survey package, such as
svyglm(), are treated a bit differently. Nosvydesignobject needs to be supplied becausewith()automatically constructs and supplies it with the imputed dataset and estimated weights. Whencluster = TRUE(orwith()detects that pairs should be clustered; see theclusterargument above), pair membership is supplied to theidsargument ofsvydesign().After weighting using
weightthem(),glm_weightit()should be used as the modeling function to fit generalized linear models. It correctly produces robust standard errors that account for estimation of the weights, if possible. SeeWeightIt::glm_weightit()for details. Otherwise,svyglm()should be used rather thanglm()in order to correctly compute standard errors.For Cox models,
coxph()will produce approximately correct standard errors when used with weighting, butsvycoxph()will produce more accurate standard errors when matching is used.
We now want to compare treatment effect estimates for treat when computed (a) using coxph (survival package) and (b) svycoxph (survey package). More information on estimating treatment effects after matching is provided in https://kosukeimai.github.io/MatchIt/articles/estimating-effects.html#survival-outcomes
3.5.0.1 coxph
# coxph result
coxph_results <- with(
data = data_mimids,
expr = coxph(formula = Surv(fu_itt_months, death_itt) ~ treat,
weights = weights,
cluster = subclass,
robust = TRUE
)
) |>
pool() |>
tidy(exponentiate = TRUE, conf.int = TRUE) |>
mutate(package = "survival") |>
select(package, term, estimate, std.error, conf.low, conf.high)
coxph_results3.5.0.2 svycoxph
# svycoxph result
svycoxph_results <- with(
data = data_mimids,
expr = svycoxph(formula = Surv(fu_itt_months, death_itt) ~ treat),
cluster = TRUE
) |>
pool() |>
tidy(exponentiate = TRUE, conf.int = TRUE) |>
mutate(package = "survey") |>
select(package, term, estimate, std.error, conf.low, conf.high)
svycoxph_results3.5.0.3 Summary
rbind(coxph_results, svycoxph_results) package term estimate std.error conf.low conf.high
1 survival treat 0.6809175 0.1662638 0.4841641 0.9576269
2 survey treat 0.6809175 0.1665147 0.4853937 0.9552010
3.5.0.4 coxph
# coxph result
coxph_results <- with(
data = data_wimids,
expr = coxph(formula = Surv(fu_itt_months, death_itt) ~ treat,
weights = weights,
robust = TRUE
)
) |>
pool() |>
tidy(exponentiate = TRUE, conf.int = TRUE) |>
mutate(package = "survival") |>
select(package, term, estimate, std.error, conf.low, conf.high)
coxph_results3.5.0.5 svycoxph
# svycoxph result
svycoxph_results <- with(
data = data_wimids,
expr = svycoxph(formula = Surv(fu_itt_months, death_itt) ~ treat),
cluster = TRUE
) |>
pool() |>
tidy(exponentiate = TRUE, conf.int = TRUE) |>
mutate(package = "survey") |>
select(package, term, estimate, std.error, conf.low, conf.high)
svycoxph_results3.5.0.6 Summary
rbind(coxph_results, svycoxph_results) package term estimate std.error conf.low conf.high
1 survival treat 0.7646088 0.07472081 0.6598544 0.8859933
2 survey treat 0.7646088 0.07472930 0.6598863 0.8859505
3.6 Session info
Script runtime: 1.01 minutes.
pander::pander(subset(data.frame(sessioninfo::package_info()), attached==TRUE, c(package, loadedversion)))| package | loadedversion | |
|---|---|---|
| cobalt | cobalt | 4.5.5 |
| dplyr | dplyr | 1.1.4 |
| furrr | furrr | 0.3.1 |
| future | future | 1.34.0 |
| gtsummary | gtsummary | 2.0.1 |
| here | here | 1.0.1 |
| MatchThem | MatchThem | 1.2.1 |
| Matrix | Matrix | 1.7-0 |
| mice | mice | 3.16.0 |
| parallelly | parallelly | 1.38.0 |
| ranger | ranger | 0.16.0 |
| survey | survey | 4.4-2 |
| survival | survival | 3.5-8 |
pander::pander(sessionInfo())R version 4.4.0 (2024-04-24)
Platform: x86_64-pc-linux-gnu
locale: LC_CTYPE=C.UTF-8, LC_NUMERIC=C, LC_TIME=C.UTF-8, LC_COLLATE=C.UTF-8, LC_MONETARY=C.UTF-8, LC_MESSAGES=C.UTF-8, LC_PAPER=C.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=C.UTF-8 and LC_IDENTIFICATION=C
attached base packages: grid, stats, graphics, grDevices, datasets, utils, methods and base
other attached packages: cobalt(v.4.5.5), furrr(v.0.3.1), future(v.1.34.0), ranger(v.0.16.0), parallelly(v.1.38.0), gtsummary(v.2.0.1), here(v.1.0.1), survey(v.4.4-2), Matrix(v.1.7-0), MatchThem(v.1.2.1), mice(v.3.16.0), survival(v.3.5-8) and dplyr(v.1.1.4)
loaded via a namespace (and not attached): tidyselect(v.1.2.1), farver(v.2.1.2), fastmap(v.1.2.0), digest(v.0.6.37), rpart(v.4.1.23), lifecycle(v.1.0.4), magrittr(v.2.0.3), compiler(v.4.4.0), rlang(v.1.1.4), sass(v.0.4.9), tools(v.4.4.0), utf8(v.1.2.4), yaml(v.2.3.10), gt(v.0.11.0), knitr(v.1.48), labeling(v.0.4.3), htmlwidgets(v.1.6.4), xml2(v.1.3.6), withr(v.3.0.1), purrr(v.1.0.2), nnet(v.7.3-19), fansi(v.1.0.6), jomo(v.2.7-6), colorspace(v.2.1-1), ggplot2(v.3.5.1), globals(v.0.16.3), scales(v.1.3.0), iterators(v.1.0.14), MASS(v.7.3-60.2), cli(v.3.6.3), rmarkdown(v.2.28), crayon(v.1.5.3), generics(v.0.1.3), sessioninfo(v.1.2.2), commonmark(v.1.9.1), minqa(v.1.2.8), DBI(v.1.2.3), pander(v.0.6.5), stringr(v.1.5.1), splines(v.4.4.0), assertthat(v.0.2.1), parallel(v.4.4.0), base64enc(v.0.1-3), mitools(v.2.4), vctrs(v.0.6.5), WeightIt(v.1.3.0), boot(v.1.3-30), glmnet(v.4.1-8), jsonlite(v.1.8.8), mitml(v.0.4-5), listenv(v.0.9.1), foreach(v.1.5.2), tidyr(v.1.3.1), glue(v.1.7.0), nloptr(v.2.1.1), pan(v.1.9), chk(v.0.9.2), codetools(v.0.2-20), stringi(v.1.8.4), shape(v.1.4.6.1), gtable(v.0.3.5), lme4(v.1.1-35.5), munsell(v.0.5.1), tibble(v.3.2.1), pillar(v.1.9.0), htmltools(v.0.5.8.1), R6(v.2.5.1), rprojroot(v.2.0.4), evaluate(v.0.24.0), lattice(v.0.22-6), markdown(v.1.13), backports(v.1.5.0), cards(v.0.2.1), tictoc(v.1.2.1), MatchIt(v.4.5.5), broom(v.1.0.6), renv(v.1.0.7), simsurv(v.1.0.0), Rcpp(v.1.0.13), nlme(v.3.1-164), xfun(v.0.47) and pkgconfig(v.2.0.3)
pander::pander(options('repos'))repos:
REPO_NAME https://packagemanager.posit.co/cran/linux/noble/latest